{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import geoviews as gv\n",
    "import cartopy.io.shapereader as shpreader\n",
    "import shapely.geometry as sgeom\n",
    "\n",
    "gv.extension('bokeh')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Define data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "def sample_data():\n",
    "    \"\"\"\n",
    "    Returns a list of latitudes and a list of longitudes (lons, lats)\n",
    "    for Hurricane Katrina (2005).\n",
    "\n",
    "    The data was originally sourced from the HURDAT2 dataset from AOML/NOAA:\n",
    "    http://www.aoml.noaa.gov/hrd/hurdat/newhurdat-all.html on 14th Dec 2012.\n",
    "\n",
    "    \"\"\"\n",
    "    lons = [-75.1, -75.7, -76.2, -76.5, -76.9, -77.7, -78.4, -79.0,\n",
    "            -79.6, -80.1, -80.3, -81.3, -82.0, -82.6, -83.3, -84.0,\n",
    "            -84.7, -85.3, -85.9, -86.7, -87.7, -88.6, -89.2, -89.6,\n",
    "            -89.6, -89.6, -89.6, -89.6, -89.1, -88.6, -88.0, -87.0,\n",
    "            -85.3, -82.9]\n",
    "\n",
    "    lats = [23.1, 23.4, 23.8, 24.5, 25.4, 26.0, 26.1, 26.2, 26.2, 26.0,\n",
    "            25.9, 25.4, 25.1, 24.9, 24.6, 24.4, 24.4, 24.5, 24.8, 25.2,\n",
    "            25.7, 26.3, 27.2, 28.2, 29.3, 29.5, 30.2, 31.1, 32.6, 34.1,\n",
    "            35.6, 37.0, 38.6, 40.1]\n",
    "\n",
    "    return lons, lats\n",
    "\n",
    "shapename = 'admin_1_states_provinces_lakes_shp'\n",
    "states_shp = shpreader.natural_earth(resolution='110m',\n",
    "                                     category='cultural', name=shapename)\n",
    "\n",
    "lons, lats = sample_data()\n",
    "track = sgeom.LineString(zip(lons, lats))\n",
    "\n",
    "title = 'US States which intersect the track of Hurricane Katrina (2005)'\n",
    "\n",
    "track_buffer = track.buffer(2)\n",
    "shapes = []\n",
    "for state in shpreader.Reader(states_shp).geometries():\n",
    "    # pick a default color for the land with a black outline,\n",
    "    # this will change if the storm intersects with our track\n",
    "    facecolor = (0.9375, 0.9375, 0.859375)\n",
    "\n",
    "    if state.intersects(track):\n",
    "        facecolor = 'red'\n",
    "    elif state.intersects(track_buffer):\n",
    "        facecolor = '#FF7E00'\n",
    "    shapes.append(gv.Shape(state).opts(style=dict(fill_color=facecolor)))\n",
    "shapes.append(gv.Shape(track_buffer).opts(style=dict(alpha=0.5)))\n",
    "shapes.append(gv.Shape(track))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Plot"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Add proxy artists for legend\n",
    "popts = dict(show_legend=True, apply_ranges=False)\n",
    "direct_hit = gv.Polygons([[(0,0)]], label='State directly intersects with track').opts(color='red', **popts)\n",
    "within_2_deg = gv.Polygons([[(0,0)]], label='State is within 2 degrees of track').opts(color='#FF7E00', **popts)\n",
    "\n",
    "(gv.Overlay(shapes) * direct_hit * within_2_deg).opts(width=700, height=500, infer_projection=True, title=title)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
